package com.cskaoyan.javase.overload._1basic;
/**
 * 一个类中,多个方法的方法名相同,那么编译器如何区分多个方法呢?
 * 方法重载要求形参不同,所以方法名相同时:
 *      编译器会根据传入实参的数据类型不同,有无实参,实参个数等来判断调用哪个方法
 *
 * 但是调用方法时,实参的数据类型和形参数据类型,并不要求完全一致,而是存在自动类型转换
 * 那么一旦出现自动类型转换,就可能出现多个方法,同时能够匹配的情况
 * 这时,方法的匹配要遵循"就近原则"
 * 就近原则: 指的是,当有多个选项都能正确匹配时，那么优先选择"最近"的。
 * 就近原则的使用,在于能够找到一个规则,指出谁更"近"
 *
 * 方法重载中的匹配:
 *      1.如果有恰好能够完全匹配的,那就不考虑类型转换了,直接匹配
 *      2.如果没有恰好匹配的,那么就考虑"较少次数"类型转换
 *          小 --> 大 过程中 更"近"的
 *          byte,short,char --> int --> long ---> float ---> double
 *
 * 思考:
 *      "就近原则"是万能的吗? 有没有失效的可能?
 *      就近原则的使用,在于能够找到一个规则,指出谁更"近"
 *      当你没有办法找到一个规则,或者这个规则比较模糊,难以判断时,就近原则就会失效.
 *      这时往往就会出现语法报错的情况.
 *
 *
 * @since 09:49
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        test();
        test(100);

        // Ambiguous method call: both 'Demo.method(int, double)' and 'Demo.method(double, int)' match
        // method(1,1);
    }

    public static void test(){}
    // public static void test(int a){}
    // public static void test(long a){}
    public static void test(float a){}
    public static void test(double a){}

    public static void method(int a,double b){}
    public static void method(double a,int b){}




}
